package com.example.livemall.service.impl;

import com.example.livemall.dto.LzjResult;
import com.example.livemall.entity.LoginLog;
import com.example.livemall.entity.ValidateCode;
import com.example.livemall.mapper.LoginMapper;
import com.example.livemall.service.LoginService;
import com.example.livemall.service.SendyzmService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.UUID;

/**
 * 登录服务业务逻辑层
 */
@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private LoginMapper loginMapper;

    @Autowired
    private SendyzmService sendyzmService;

    /**
     * 登录， 所有的操作结果都必须记录登录日志。
     * 1. 是否触发熔断逻辑，异常逻辑。
     * 2. 根据手机号查询验证码服务，获取验证码。 检查是否有数据，无数据，记录日志，返回登录失败。
     * 3. 有数据则校验，用户发送的验证码和服务中记录的验证码是否匹配，如果不匹配，记录日志，返回登录失败。
     * 4. 校验验证码成功，记录日志，并删除服务中存储的验证码。返回登录成功。
     *
     * @param username 手机号
     * @param password 验证码
     * @return
     */
    @Override
    public LzjResult login(String username, String password) {
        LoginLog loginLog = new LoginLog();
        loginLog.setId(String.valueOf(UUID.randomUUID()));
        loginLog.setType(String.valueOf(1));// 1 验证码登录 2 用户名密码
        loginLog.setUsername(username);// 登录失败的手机号
        loginLog.setLoginTime(new Date());// 登录时间
        String msg = null;
        // 远程调用验证码服务
        ValidateCode validateCode = sendyzmService.getCode(username);

        // 1. 是否触发熔断逻辑，异常逻辑。
        if (validateCode != null && "error".equals(validateCode.getCode())) {
            msg = "验证码登录功能异常，请使用用户名密码方式登录。";
            loginLog.setMessage(msg);
            // 记录登录日志
            loginMapper.saveLoginLog(loginLog);
            return LzjResult.error(msg);
        }

        // 2. 根据手机号查询验证码服务，获取验证码。 检查是否有数据，无数据，记录日志，返回登录失败。
        if (null == validateCode) {
            // 记录登录日志
            msg = "验证码已过期，请重新发送。";
            loginLog.setMessage(msg);
            // 记录登录日志
            loginMapper.saveLoginLog(loginLog);
            return LzjResult.error(msg);
        }

        // 3. 有数据则校验，用户发送的验证码和服务中记录的验证码是否匹配，如果不匹配，记录日志，返回登录失败。
        if (!password.equals(validateCode.getCode())) {
            // 记录登录日志
            msg = "验证码不匹配，请重新输入。";
            loginLog.setMessage(msg);
            // 记录登录日志
            loginMapper.saveLoginLog(loginLog);
            return LzjResult.error(msg);
        }

        // 4. 校验验证码成功，记录日志，并删除服务中存储的验证码。返回登录成功。
        loginLog.setIsSuccess(true); // 登录成功
         msg = "登录成功。";
        loginLog.setMessage(msg);
        // 记录登录日志
        loginMapper.saveLoginLog(loginLog);
        // 删除验证码
        sendyzmService.deleteCode(username);
        return LzjResult.success(msg);
    }

}
